Flutter Riverpod
Riverpod 是一个 Flutter 的响应式数据绑定框架,作者是 Provider 库的作者。Riverpod 是对 Provider 包的完全重写,以解决 Provider 的某些局限性,如类型安全、灵活性和可测试性。
许多人将 Riverpod 视为状态管理框架,但远不止如此。
优势:
- 代码质量:编译时捕获编程错误
- 网络数据获取:获取、缓存、更新
- UI 更新:带有缓存的响应式编程
- 异步:支持异步操作,支持计算状态(Coputed state)
- 胶水代码少:精简样板代码(boilerplate code),组合模式
- 资源释放:及时释放状态,内置 AutoDispose
- 可测试性:业务逻辑与 UI 解绑,可对业务无头单测
背景:Why not Provider?
ProviderNotFoundException
Provider 依赖 InheritedWidget,依赖于 Flutter Widget Tree。导致 ProviderNotFoundException 问题:
BuildContext 带来复杂度
Provider 依赖 InheritedWidget,需要使用 BuildContext 进行组件树遍历。
这个过程与组件的生命周期相耦合,对使用者更加复杂,更加容易出错。
AutoDispose
Provider 提供了状态创建的过程,但框架本身对于状态释放销毁支持较弱。尤其是与组件生命周期自动关联。
Why Riverpod?
全局状态声明
程序状态与组件树解耦,作为全局声明。解决 ProviderNotFoundException 问题。
简化引用方式,变量引用,编译时语法检查,将复杂度,提升代码质量。
与 BuildContext 解耦
访问状态不需要 BuildContext。减少运行时出错可能性。
处理嵌套依赖
状态间嵌套引用时,依赖状态更新时,按照依赖关系进行响应。
AutoDispose
状态自动与组件生命周期关联。组件销毁时,为状态提供资源释放时机。
Hooks or not Hooks
RiverPod 提供有三个版本,在 Flutter 下有两个选择 flutter_hooks
和 flutter_riverpod
,带有 Hooks 功能的和不带的。如何选择呢?
它们的主要特点和差异,以帮助您做出选择:
flutter_hooks:
- 目的:
flutter_hooks
旨在简化 Flutter 中的 widget 生命周期管理。它为常用的 Flutter 生命周期事件提供了 Hooks(钩子),如useEffect
、useState
等。 - 特点:它使得组件的状态和副作用管理更为简洁,避免了大量的代码重复。
- 使用场景:如果您发现自己频繁地在多个组件中复用相同的逻辑,或者想要将组件逻辑抽象为自定义 Hooks,那么
flutter_hooks
可能很适合您。
flutter_riverpod:
- 目的:
flutter_riverpod
是 Riverpod 的 Flutter 版本,主要用于状态管理。 - 特点:与传统的
Provider
相比,它提供了更强大的编译时安全性、灵活性和组织性。它也提供了一系列的 Providers,如StateProvider
、FutureProvider
等。 - 使用场景:如果您需要一个功能强大、灵活且类型安全的状态管理解决方案,那么
flutter_riverpod
是一个很好的选择。
如何选择:
-
如果您的主要需求是简化和抽象 widget 的状态和生命周期管理,而不是全局状态管理,那么您应该选择
flutter_hooks
。 -
如果您正在寻找一个全局状态管理解决方案,并希望从 Riverpod 的优点中受益,那么您应该选择
flutter_riverpod
。
同时使用:
值得注意的是,您可以同时使用 flutter_hooks
和 flutter_riverpod
。例如,您可以使用 flutter_hooks
来管理组件的局部状态和生命周期,同时使用 flutter_riverpod
来管理应用的全局状态。这两者之间是兼容的,结合使用可以为您提供更强大和灵活的工具集。
基础概念
ProviderScope
ProviderScope
是一个 Widget,用于存储我们创建的所有提供程序的状态。
将整个 App 用 ProviderScope 包裹:
void main() {
runApp(ProviderScope(
child: MyApp(),
));
}
内部实现:ProviderScope
创建一个 ProviderContainer
实例。
Riverpod Provider
定义:为封装一些状态并允许侦听该状态的对象。
两个库的作者是同一个人。
选择 Provider 还是 Riverpod 主要取决于您的项目需求和您希望达到的目标。以下是一些考虑因素,可以帮助您做出决策:
-
类型安全:Riverpod 为状态管理提供了更强的类型安全。如果您希望系统在编译时捕获更多的错误并减少运行时的错误,Riverpod 可能更适合您。
-
灵活性:Riverpod 提供了多种 Provider 类型,如
StateProvider
、FutureProvider
和StreamProvider
,让您更容易管理各种状态和数据流。同时,其 Provider 可以声明为全局的,这使得状态访问和组织更为灵活。 -
自动清理:Riverpod 提供了
.autoDispose
修饰符,允许在 Provider 不再被使用时自动清理资源。如果您的应用中有许多短暂的状态或需要管理资源生命周期,Riverpod 可能更有优势。 -
可测试性:Riverpod 设计时考虑到了可测试性,使得对状态逻辑的单元测试更为简单。
-
学习曲线:虽然 Riverpod 提供了许多先进的功能,但它的学习曲线可能比 Provider 更陡峭。如果您已经熟悉 Provider,并且不需要 Riverpod 提供的额外功能,那么继续使用 Provider 可能更为合适。
-
社区支持和生态系统:Provider 有着广泛的社区支持和丰富的插件生态。虽然 Riverpod 正在迅速增长,但其生态系统可能还不如 Provider 丰富。
-
项目已有架构:如果您的项目已经使用了 Provider 并且运行良好,那么除非您需要 Riverpod 的某些特定功能,否则可能没有必要迁移到 Riverpod。
总结:Riverpod 提供了一些 Provider 所不具备的高级功能,但也带来了更高的复杂性。您应根据项目的具体需求、团队的经验和目标来决定使用哪个工具。如果您追求更高的类型安全、灵活性和可测试性,Riverpod 可能是更好的选择。如果您希望快速上手或利用一个已有的生态系统,Provider 可能更合适。
2. 基本概念
- Provider:这是 Riverpod 的核心。它是一个可观察的对象,可以产生值并在该值发生变化时通知其消费者。
- Consumer:这是一个小部件,它可以监听 Provider 的变化并重建其子部件。
3. 使用方法
-
声明 Provider:
final helloWorldProvider = Provider<String>((ref) => 'Hello World');
-
消费 Provider:
使用Consumer
或context.read
来消费上述 Provider。final greeting = context.read(helloWorldProvider);
4. StateProvider
一个简单的状态管理工具。例如,用于存储一个计数器的值。
final counterProvider = StateProvider<int>((ref) => 0);
使用 state
属性来读取或修改状态:
final counter = context.read(counterProvider).state;
context.read(counterProvider).state++;
5. FutureProvider 和 StreamProvider
用于处理异步数据。
final futureSampleProvider = FutureProvider<int>((ref) async {
await Future.delayed(Duration(seconds: 1));
return 42;
});
6. 依赖于其他 Provider
Providers 可以依赖于其他 Providers。当所依赖的 Provider 发生变化时,该 Provider 也会重新计算。
final someValueProvider = Provider<int>((ref) => 10);
final dependentProvider = Provider<int>((ref) {
final someValue = ref.watch(someValueProvider);
return someValue * 2;
});
7. AutoDispose
用于自动释放未使用的资源。
final autoDisposeProvider = Provider.autoDispose<String>((ref) => 'AutoDispose Sample');
Riverpod 2.0
Riverpod 的最新版本。
网络资源
Riverpodで状態管理 | Flutterで始めるアプリ開発 --- 使用 Riverpod 进行状态管理 | Flutter 应用程序开发入门 (flutter-study.dev)
【Flutter】Riverpod 入門 --- 【颤振】 开始使用 Riverpod (zenn.dev)
Flutter Riverpod 2.0: The Ultimate Guide (codewithandrea.com):推荐
riverpod_generator | Dart Package (pub.dev)
重走Flutter状态管理之路—Riverpod最终篇 (xuyisheng.top)
Flutter Riverpod Snippets - Visual Studio Marketplace
Flutter Riverpod Snippets - IntelliJ IDEs Plugin | Marketplace (jetbrains.com)
本文作者:Maeiee
本文链接:Flutter Riverpod
版权声明:如无特别声明,本文即为原创文章,版权归 Maeiee 所有,未经允许不得转载!
喜欢我文章的朋友请随缘打赏,鼓励我创作更多更好的作品!